class EventBus{
    constructor(){
        this.events = {};
    }
    //给事件总线添加一个type类型的监听回调函数
    addListener(type,callback){
        let callbacks = this.events[type];
        if(callbacks){
            //如果不是第一次添加回调，则把函数放到数组
            callbacks.push(callback);
        }else{//第一次肯定取不出来东西，是undefined
            callbacks=[callback];
        }
        //把新的数组保存回对象
        this.events[type]=callbacks;
    }
    //触发事件，发射type类型的事件 
    emit(type){
        //当派发某个事件的时候，取出此事件对应的回调函数数组，然后把它们依次执行
        let callbacks = this.events[type];
        callbacks.forEach(callback=>callback());
    }
}
class Publisher{
    constructor(eventBus){
        this.eventBus = eventBus;
    }
    publish(type){
        ///让事件总线，也就是经纪人发射一个事件 type=song
        this.eventBus.emit(type);
    }
}
class Subscriber{
    constructor(eventBus,type){
        //向事件总线也就是经纪人添加一个监听函数，类型是 song，函数是当前类的实例的update方法
        eventBus.addListener(type,this.update);
    }
    update(){
        console.log('买票') 
    }
}
//创建事件总线，也就是经纪人
const eventBus = new EventBus();
//创建发布者，也就是明星
const publisher = new Publisher(eventBus);
//创建订阅者1号，也就是粉丝1号，监听song事件，当song事件发生的时候执行订阅者对应的更新函数
const subscriber1 = new Subscriber(eventBus,'song');
const subscriber2 = new Subscriber(eventBus,'song');
//发布者发布song事件,相当于明星要要唱歌了，其它它内部通知的是事件总线，也就是经纪人。再由经纪人通知粉丝，执行粉丝的更新函数
publisher.publish('song');

